package com.xsh.opensltest.utils;

import com.chengtao.pianoview.entity.Piano;

public class MidiUtils
{
    /**
     * 将钢琴键点击事件参数转换为标准 MIDI 音符编号
     *
     * @param type              键类型（BLACK/WHITE）
     * @param voice             音名（DO, RE, MI, FA, SO, LA, SI）
     * @param group             组别（白键 0~8，黑键 0~7）
     * @param positionOfGroup   在组内的位置
     * @return                  MIDI 音符编号（0~127）
     */
    public static int toMidiNoteNumber(Piano.PianoKeyType type, Piano.PianoVoice voice, int group, int positionOfGroup)
    {
        // 白键 DO 对应的偏移数组（每个音名对应在该八度中的半音位置）
        int[] whiteKeyOffsets = {
                /* DO */ 0,
                /* RE */ 2,
                /* MI */ 4,
                /* FA */ 5,
                /* SO */ 7,
                /* LA */ 9,
                /* SI */ 11
        };

        // 黑键 DO 对应的偏移数组（用于修正黑键的半音位置）
        int[] blackKeyCorrections = {
                /* DO */ +1,
                /* RE */ +1,
                /* FA */ +1,
                /* SO */ +1,
                /* LA */ +1,
                /* SI */ 0, // MI/SI 没有黑键
                /* MI */ 0
        };

        // 计算基础 MIDI 音符编号（基于白键 DO 的起始位置）
        int baseNote;
        if (type == Piano.PianoKeyType.WHITE) {
            baseNote = group * 12 + whiteKeyOffsets[voice.ordinal()];
        } else {
            // 黑键需要根据对应的白键进行 +1 偏移
            int whiteNoteOffset = whiteKeyOffsets[voice.ordinal()];
            baseNote = group * 12 + whiteNoteOffset + blackKeyCorrections[voice.ordinal()];
        }

        return baseNote;
    }
}
